package genericity

// 先看这两个函数，逻辑一样，就是入参和出参不一样
func getMaxNumInt(a, b int) int {
	if a > b {
		return a
	}
	return b
}
func getMaxNumFloat(a, b float64) float64 {
	if a > b {
		return a
	}
	return b
}

// 使用泛型解决优化问题，泛型写法 [] 内编写
// 接受参数可以指定哪些类型，返回的就是什么类型，但是为啥不直接写 any 任意类型，因为有的类型比如结构体，没法比较
func getMaxNum[T int | float64](a, b T) T {
	if a > b {
		return a
	}
	return b
}

// 一般情况，上面的函数写法就可以了，但如果有时候接受的是指针类型的值，需要使用 interface{} 包起来，不然会解读成 相乘 的意思了
func getMaxNum2[T interface{ *int | *float64 }](a, b T) T {
	return nil
}

// 测试使用泛型
func Test() {
	println(getMaxNum(1, 2))
	// 还可以这样使用，调用泛型函数时候指定类型
	println(getMaxNum[int](1, 2))
}

// 如果函数入参要支持很多种泛型，总不能一下写很长吧，所以可以自定义个类型，参考 demo2 代码
